<?xml version="1.0" encoding="utf-8"?>
<Schemas>
  <Interface ref.Class="vm::IFileFactoryModel">
    <Property Name="Image" Type="presentation::GuiImageData^" Readonly="true"/>
    <Property Name="SmallImage" Type="presentation::GuiImageData^" Readonly="true"/>
    <Property Name="Name" Type="string" Readonly="true"/>
    <Property Name="Category" Type="string" Readonly="true"/>
    <Property Name="Description" Type="string" Readonly="true"/>
    <Property Name="Id" Type="string" Readonly="true"/>
    <Property Name="DefaultFileExt" Type="string" Readonly="true"/>
    <Property Name="TextTemplate" Type="vm::ITextTemplate^" Readonly="true"/>
    <Property Name="ContentFactory" Type="vm::IEditorContentFactoryModel^" Readonly="true"/>
  </Interface>

  <Interface ref.Class="vm::IProjectFactoryModel">
    <Property Name="Image" Type="presentation::GuiImageData^" Readonly="true"/>
    <Property Name="SmallImage" Type="presentation::GuiImageData^" Readonly="true"/>
    <Property Name="Name" Type="string" Readonly="true"/>
    <Property Name="Description" Type="string" Readonly="true"/>
    <Property Name="Id" Type="string" Readonly="true"/>
    <Property Name="Children" Type="vm::IProjectFactoryModel^{}" Readonly="true"/>
  </Interface>

  <Interface ref.Class="vm::IStudioNewFileModel">
    <Property Name="FileFilters" Type="vm::IProjectFactoryModel^" Readonly="true"/>
    <Property Name="SelectedFileFilter" Type="vm::IProjectFactoryModel^"/>
    <Property Name="FilteredFileFactories" Type="system::ObservableList^" Readonly="true"/>
  </Interface>
  
  <Class ref.Class="vm::StudioFileReference">
    <Property Name="name" Type="string"/>
    <Property Name="folder" Type="string"/>
    <Property Name="fileFactory" Type="vm::IFileFactoryModel^"/>
  </Class>

  <Interface ref.Class="vm::IStudioAddExistingFilesModel">
    <Property Name="SelectedFiles" Type="system::ObservableList^" Readonly="true"/>
    <Property Name="CurrentFileName" Type="string"/>
    <Property Name="FilteredFileFactories" Type="system::ObservableList^" Readonly="true"/>

    <Method Name="AddFiles" Type="void">
      <Argument Name="fileNames" Type="string{}"/>
    </Method>
    <Method Name="RemoveFiles" Type="void">
      <Argument Name="indices" Type="int{}"/>
    </Method>
  </Interface>
  
  <Interface ref.Class="vm::IStudioModel">
    <Property Name="ProjectFactories" Type="vm::IProjectFactoryModel^{}" Readonly="true"/>
    <Property Name="FileFactories" Type="vm::IFileFactoryModel^{}" Readonly="true"/>
    <Property Name="ContentFactories" Type="vm::IEditorContentFactoryModel^{}" Readonly="true"/>
    <Property Name="EditorFactories" Type="vm::IEditorFactoryModel^{}" Readonly="true"/>

    <Method Name="CreateNewFileModel" Type="vm::IStudioNewFileModel^"/>
    <Method Name="CreateAddExistingFilesModel" Type="vm::IStudioAddExistingFilesModel^">
      <Argument Name="action" Type="vm::IAddFileItemAction^"/>
    </Method>

    <Property Name="RootSolutionItem" Type="vm::ISolutionItemModel^" Readonly="true"/>
    <Property Name="OpenedSolution" Type="vm::ISolutionModel^" Readonly="true" Observable="true"/>
    <Method Name="NotifySelectedSolutionItem" Type="void">
      <Argument Name="solutionItem" Type="vm::ISolutionItemModel^"/>
    </Method>
    <Property Name="WorkingItem" Type="vm::ISolutionItemModel^" Readonly="true" Observable="true"/>
    <Property Name="WorkingProject" Type="vm::IProjectModel^" Readonly="true" Observable="true"/>
    <Property Name="WorkingDirectory" Type="string" Readonly="true" Observable="true"/>

    <Method Name="GetProjectFactory" Type="vm::IProjectFactoryModel^">
      <Argument Name="id" Type="string"/>
    </Method>
    <Method Name="GetFileFactory" Type="vm::IFileFactoryModel^">
      <Argument Name="id" Type="string"/>
    </Method>
    <Method Name="GetEditorFactory" Type="vm::IEditorFactoryModel^">
      <Argument Name="id" Type="string"/>
    </Method>
    <Method Name="GetAssociatedEditors" Type="vm::IEditorFactoryModel^{}">
      <Argument Name="contentFactory" Type="vm::IEditorContentFactoryModel^"/>
    </Method>

    <Method Name="OpenSolution" Type="void">
      <Argument Name="filePath" Type="string"/>
    </Method>
    <Method Name="NewSolution" Type="void">
      <Argument Name="filePath" Type="string"/>
    </Method>
    <Method Name="CloseSolution" Type="void">
    </Method>
    <Method Name="AddNewProject" Type="vm::IProjectModel^">
      <Argument Name="createNewSolution" Type="bool"/>
      <Argument Name="projectFactory" Type="vm::IProjectFactoryModel^"/>
      <Argument Name="projectName" Type="string"/>
      <Argument Name="solutionDirectory" Type="string"/>
      <Argument Name="solutionName" Type="string"/>
    </Method>
    <Method Name="AddNewFile" Type="vm::IFileModel^">
      <Argument Name="action" Type="vm::IAddFileItemAction^"/>
      <Argument Name="fileFactory" Type="vm::IFileFactoryModel^"/>
      <Argument Name="fileDirectory" Type="string"/>
      <Argument Name="fileName" Type="string"/>
    </Method>
    <Method Name="AddExistingFiles" Type="void">
      <Argument Name="action" Type="vm::IAddFileItemAction^"/>
      <Argument Name="files" Type="vm::StudioFileReference^{}"/>
    </Method>
    <Method Name="RenameFile" Type="void">
      <Argument Name="action" Type="vm::IRenameItemAction^"/>
      <Argument Name="solutionItem" Type="vm::ISolutionItemModel^"/>
      <Argument Name="newName" Type="string"/>
    </Method>
    <Method Name="RemoveFile" Type="void">
      <Argument Name="action" Type="vm::IRemoveItemAction^"/>
      <Argument Name="solutionItem" Type="vm::ISolutionItemModel^"/>
    </Method>

    <Method Name="OpenBrowser" Type="void">
      <Argument Name="url" Type="string"/>
    </Method>
    <Method Name="PromptError" Type="void">
      <Argument Name="message" Type="string"/>
    </Method>
    <Method Name="SafeExecute" Type="bool">
      <Argument Name="procedure" Type="func():void"/>
    </Method>
    <Method Name="ExecuteSaveItems" Type="void">
      <Argument Name="saveItems" Type="vm::ISaveItemAction^{}"/>
    </Method>
  </Interface>
</Schemas>